/*
 * @Author: zhl
 * @Date: 2021-09-01 14:15:43
 * @LastEditTime: 2021-09-27 15:41:34
 * @LastEditors: zhl
 * @Description: In User Settings Edit
 * @FilePath: \Test\include\DLT698_Frame.h
 */
#ifndef __DLT698_FRAME_H__
#define __DLT698_FRAME_H__

#include <stdint.h>

/*----------------------------------------------*/
/*帧相关 开始*/
typedef enum _TRANSMIT_INITIATE_DIRECTION{
    C_TO_S_REQUEST    = 0,
    C_TO_S_RESPONSE   = 1,
    S_TO_C_REQUEST    = 2,
    S_TO_C_RESPONSE   = 3
}TRANSMIT_INITIATE_DIRECTION;

typedef enum _DLT698_FRAME_SA_TYPE{
    SA_TYPE_ONE_ADDRESS       = 0,
    SA_TYPE_WILDCARD_ADDRESS  = 1,
    SA_TYPE_GROUP_ADDRESS     = 2,
    SA_TYPE_BROADCAST_ADDRESS = 3
}DLT698_FRAME_SA_TYPE;

typedef struct _CONTROL_CODE_FIELDS{
    unsigned char func_code:3;   //功能码
    unsigned char        sc:1;   //扰码标志
    unsigned char   reserve:1;   //保留
    unsigned char sub_frame:1;   //分帧标志
    unsigned char       prm:1;   //启动标志
    unsigned char       dir:1;   //传输方向
}CONTROL_CODE_FIELDS;

typedef union _CONTROL_CODE{
    CONTROL_CODE_FIELDS control_code;
    unsigned char value;
}CONTROL_CODE;

typedef struct _SERVER_ADDR_FEATURE_FIELDS{
    unsigned char  addr_len:4;    //地址长度
    unsigned char        la:2;    //逻辑地址
    unsigned char addr_type:2;    //地址类型
}SERVER_ADDR_FEATURE_FIELDS;

typedef union _SERVER_ADDR_FEATURE{
    SERVER_ADDR_FEATURE_FIELDS sa_fc;
    unsigned char value;
}SERVER_ADDR_FEATURE;

typedef struct _DLT698_FRAME{
    //前导码
    uint8_t  lc[4] = {0xFE, 0xFE, 0xFE, 0xFE};
    //扰码
    uint8_t  sbc;
    //帧起始码
    uint8_t  sc;
    //除起始字符、结束字符外的长度
    uint16_t l;
    //控制码
    CONTROL_CODE  c;
    //地址域SA的第一个字节特征码
    SERVER_ADDR_FEATURE  sa_fc;
    //地址域SA
    uint8_t  sa[16];
    //客户机地址域CA
    uint8_t  ca;
    //帧头校验码
    uint16_t hcs;
    //用户数据
    uint8_t  *apdu;
    //帧校验码
    uint16_t fcs;
    //帧结束符
    uint8_t  em;

}DLT698_FRAME;

typedef struct _DLT698_FRAME_C{
    //传输与发起的方向
    TRANSMIT_INITIATE_DIRECTION direction;
    //分帧标志
    int sub_frame_flag;
    //扰码标志
    int sc_flag;
    //功能码
    int func_code;

}DLT698_FRAME_C;

typedef struct _PIID_FIELDS{
    unsigned char       sn:6;
    unsigned char  reserve:1;
    unsigned char priority:1;
}PIID_FIELDS;


typedef union _PIID{
    PIID_FIELDS fields;
    unsigned char value;
}PIID;

typedef struct _PIID_ACD_FIELDS{
    unsigned char       sn:6;
    unsigned char      acd:1;
    unsigned char priority:1;
    _PIID_ACD_FIELDS(){
        sn = 0;
        acd = 0;
        priority = 0;
    }
}PIID_ACD_FIELDS;


typedef union _PIID_ACD{
    PIID_ACD_FIELDS fields;
    unsigned char value;
}PIID_ACD;

typedef struct _SEPARATE_FRAME_FIELDS{
    unsigned short      sn:12;
    unsigned short reserve:2;
    unsigned short    type:2;
}SEPARATE_FRAME_FIELDS;

typedef union _SEPARATE_FRAME{
    SEPARATE_FRAME_FIELDS sf;
    uint16_t  value;
}SEPARATE_FRAME;

/*帧相关 结束*/
/*----------------------------------------------*/

/*----------------------------------------------*/
/*预连接 开始*/

typedef enum _LINK_REQUEST_TYPE{
    LINK_REQ_LOGIN     = 0,      //登录
    LINK_REQ_HEARTBEAT = 1,      //心跳
    LINK_REQ_LOGOUT    = 2       //退出登录
}LINK_REQUEST_TYPE;

typedef struct _LINK_RESPONSE_RESULT{
    unsigned char       result:3;     //0：成功， 1：地址重复， 2：非法设备， 3：容量不足，其它值：保留
    unsigned char      reserve3:1;
    unsigned char      reserve4:1;
    unsigned char      reserve5:1;
    unsigned char      reserve6:1;
    unsigned char       trusted:1;    //0：不可信， 1：可信。
}LINK_RESPONSE_RESULT;
typedef struct _LINK_REQUEST_FRAME{
    PIID_ACD          piid;               //服务序号-优先级-ACD
    LINK_REQUEST_TYPE type;               //请求类型
    uint16_t          heartbeat_interval; //心跳周期
    unsigned char     req_datetime[10];   //请求时间
}LINK_REQUEST_FRAME;

typedef struct _LINK_RESPONSE_FRAME{
    PIID       piid;                //服务序号-优先级
    LINK_RESPONSE_RESULT result;    //结果
    unsigned char req_datetime[10]; //请求时间请求时间
    unsigned char rcv_datetime[10]; //收到时间
    unsigned char rsp_datetime[10]; //响应时间
}LINK_RESPONSE_FRAM;

/*预连接 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*建立应用连接 开始*/
typedef enum _CONNECT_MECHANISM_INFO_TYPE{
    CONNECT_MECHANISM_NULL_SECURITY      = 0, //公共连接 [0] NullSecurity，
    CONNECT_MECHANISM_PWD_SECURITY       = 1, //一般密码 [1] PasswordSecurity，
    CONNECT_MECHANISM_SYMMETRY_SECURITY  = 2, //对称加密 [2] SymmetrySecurity，
    CONNECT_MECHANISM_SIGNATURE_SECURITY = 3, //数字签名 [3] SignatureSecurity
}CONNECT_MECHANISM_INFO_TYPE;

typedef struct _PROTOCOL_CONFORMANCE{
    uint8_t       app_association:1;  //应用连接协商 Application Association （0），
    uint8_t            get_normal:1;  //请求对象属性 Get Normal （1），
    uint8_t         get_with_list:1;  //批量请求基本对象属性 Get With List （2），
    uint8_t            get_record:1;  //请求记录型对象属性 Get Record （3），
    uint8_t             get_proxy:1;  //代理请求对象属性 Get Proxy （4），
    uint8_t      get_proxy_record:1;  //代理请求记录型对象属性 Get Proxy Record （5），
    uint8_t   get_subsequent_rame:1;  //请求分帧后续帧 Get Subsequent Frame （6），
    uint8_t            set_normal:1;  //设置基本对象属性 Set Normal （7），
    uint8_t         set_with_list:1;  //批量设置基本对象属性 Set With List （8），
    uint8_t          set_with_get:1;  //设置后读取 Set With Get （9），
    uint8_t             set_proxy:1;  //代理设置对象属性 Set Proxy （10），
    uint8_t    set_proxy_with_get:1;  //代理设置后读取对象属性 Set Proxy With Get （11），
    uint8_t         action_normal:1;  //执行对象方法 Action Normal （12），
    uint8_t      action_with_list:1;  //批量执行对象方法 Action With List （13），
    uint8_t action_read_with_list:1;  //执行方法后读取 Action With List （14），
    uint8_t          action_proxy:1;  //代理执行对象方法 Action Proxy （15），
    uint8_t action_proxy_with_get:1;  //代理执行后读取 Action Proxy With Get （16），
    uint8_t   active_event_report:1;  //事件主动上报 Active Event Report （17），
    uint8_t         follow_report:1;  //事件尾随上报 （18)，
    uint8_t        action_req_acd:1;  //事件请求访问位 ACD 上报 （19)，
    uint8_t             sub_frame:1;  //分帧数据传输 （20），
    uint8_t security_transmission:1;  //安全方式传输 （31），
    uint8_t              ID0_READ:1;  //对象属性 ID 为 0 的读取访问 （32），
    uint8_t             ID0_VISIT:1;  //对象属性 ID 为 0 的设置访问 （33）
    uint8_t               reserve[5];
}PROTOCOL_CONFORMANCE;

typedef struct _FUNCTION_CONFORMANCE{
    uint8_t          electric_energy_meter:1; //电能量计量   （0），
    uint8_t                two_power_meter:1; //双向有功计量 （1），
    uint8_t           reactive_power_meter:1; //无功电能计量 （2），
    uint8_t           apparent_power_meter:1; //视在电能计量 （3），
    uint8_t                   ctive_demand:1; //有功需量    （4），
    uint8_t                reactive_demand:1; //无功需量    （5），
    uint8_t                apparent_demand:1; //视在需量    （6），
    uint8_t                  multiple_rate:1; //复费率     （7），
    uint8_t                  valve_control:1; //阀控       （8），
    uint8_t             local_cost_control:1; //本地费控 （9），
    uint8_t            remote_cost_control:1; //远程费控 （10），
    uint8_t    fundamental_electric_energy:1; //基波电能 （11），
    uint8_t       harmonic_electric_energy:1; //谐波电能 （12），
    uint8_t               harmonic_content:1; //谐波含量 （13），
    uint8_t            waveform_distortion:1; //波形失真度 （14），
    uint8_t  multifunction_terminal_output:1; //多功能端子输出 （15），
    uint8_t                   event_record:1; //事件记录 （16），
    uint8_t                   event_report:1; //事件上报 （17），
    uint8_t        temperature_measurement:1; //温度测量 （18），
    uint8_t                 status_monitor:1; //状态量监测 （19），
    uint8_t         communication_ethernet:1; //以太网通信 （20），
    uint8_t        communication_infra_red:1; //红外通信 （21），
    uint8_t        communication_bluetooth:1; //蓝牙通信 （22），
    uint8_t                    multi_media:1; //多媒体采集 （23），
    uint8_t                        reserve:1; //保留 （24），
    uint8_t             dc_analog_quantity:1; //直流模拟量 （25），
    uint8_t         weak_current_interface:1; //弱电端子 12V 输出 （26），
    uint8_t          search_electric_meter:1; //搜表 （27），
    uint8_t       three_phase_load_balance:1; //三相负载平衡 （28），
    uint8_t                         update:1; //升级 （29）
    uint8_t                       reserve1:2; //保留
    uint8_t                       reserve2[12]; //保留
}FUNCTION_CONFORMANCE;

typedef struct _CONNECT_REQUEST_FRAME{
    PIID  piid; //服务序号-优先级 PIID，
    uint16_t protocol_ver; //期望的协议版本号 long-unsigned，
    PROTOCOL_CONFORMANCE protocol_conformance; //期望的协议一致性块 ProtocolConformance，
    FUNCTION_CONFORMANCE function_conformance; //期望的功能一致性块 FunctionConformance，
    uint16_t frame_max_size; //客户机发送帧最大尺寸 long-unsigned，
    uint16_t recv_max_size; //客户机接收帧最大尺寸 long-unsigned，
    uint16_t recv_max_widow_size; //客户机接收帧最大窗口尺寸 unsigned，
    uint16_t handle_fame_max_size; //客户机最大可处理帧尺寸 long-unsigned，
    uint32_t expected_timeout; //期望的应用连接超时时间 double-long-unsigned，
    CONNECT_MECHANISM_INFO_TYPE connect_mechanism; //认证请求对象 ConnectMechanismInfo
}CONNECT_REQUEST_FRAME;

/*建立应用连接 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*断开应用连接 开始*/


/*断开应用连接 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*读取 开始*/


/*读取 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*设置 开始*/


/*设置 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*上报 开始*/


/*上报 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*代理 开始*/


/*代理 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*安全传输 开始*/


/*安全传输 结束*/
/*----------------------------------------------*/
typedef uint8_t  APDU_TAG_TYPE;
typedef uint8_t  APDU_FUNC_TYPE;
typedef uint8_t  PIID_TYPE;
typedef uint8_t  RESULT_TYPE;
typedef uint8_t  DATA_CODE_TYPE;
typedef uint8_t  DATA_SIZE_TYPE;
typedef uint8_t  OAD_TYPE[4];
typedef uint8_t  ERROR_CODE_TYPE[4];


#endif